import axios from 'axios'
import router from '@/router'
import qs from 'qs'
import HmacSHA256 from 'crypto-js/hmac-sha256'
axios.defaults.baseURL = "/management/"
//请求公共设置
axios.defaults.timeout = 8000
axios.defaults.headers.common['X-Access-Device'] = 'PCWEB'
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'

axios.interceptors.request.use(config => {    // 这里的config包含每次请求的内容
    return config;
}, err => {
    return err;
});

axios.interceptors.response.use(response => {
    return response
}, error => {
    return error.response
});
function checkStatus(response) {

    // 如果http状态码正常，则直接返回数据
    if (response && (response.status === 200 || response.status === 304 ||
        response.status === 400 || response.status === 403 || response.status === 503)) {
        return response.data
    }
    if(response && (response.status === 401 )){
      return {
        status: -401,
        msg: '请登录'
      }
    }
    // 异常状态下，把错误信息返回去
    return {
        status: -404,
        msg: '网络异常'
    }
}
function checkCode(res) {
  console.log(res);
    // 如果code异常(这里已经包括网络错误，服务器错误，后端抛出的错误)，可以弹出一个错误提示，告诉用户
    if (res.status === -404) {
        console.log(res.msg)
      // console.log("ooooo");
      // this.$message.error(res.msg);
    }
    if(res.status===-401){
      router.push({path:"/login"});
    }
    if (res.data && (!res.data.success)) {
        // alert(res.data.error_msg)
      // this.$message.error(res.data.error_msg);
    }
    return res
}

// 参数值排序后连接成一个字符串等待签名
const _getParameterValues = param => {
    var queryString = param
    if (param && typeof param === 'object' && Object.keys(param).length > 0) {
      queryString = qs.stringify(param, { arrayFormat: 'brackets', allowDots: true, encode: false }) + '&'
    }
    var paramValues
    if(queryString.match(/=.*?&/g)){
      paramValues = queryString.match(/=.*?&/g).map(item => item.replace(/[=\&]/g, ''))
    }
    return paramValues.sort().join('')
}

/**
 * 将对象转换为 name=hehe&age=10  这种格式，以便用 x-www-form-urlencoded 提交数据
 */
const _toParams = function(data) {
    if (typeof data === 'string') return data
    if (typeof data === 'object') return qs.stringify(data, { arrayFormat: 'repeat', allowDots: true })
    return data
  }

// 数据签名,并放入请求头  uri 为提交的uri， data为post提交的数据, config 为配置信息，get提交的数据放在 config.params中
const _signHeader = (uri,data,config) => {
    var headers = config.headers || {}
    // 如果是开发环境，则不对请求头进行签名, 暂时注释
    // if (process.env.NODE_ENV === 'development') return
    const signData = {
      uri: axios.defaults.baseURL+uri,
      pricipal: window.localStorage.getItem('accountName')|| '',
      timestamp: new Date().valueOf(),
      accessToken: window.localStorage.getItem('accessToken') || '',
      securityKey: window.localStorage.getItem('securityKey') || '',
      device: 'PCWEB'
    }
    if (!signData.uri.startsWith('/')) {
      signData.uri = '/' + signData.uri
    }
    headers['X-Access-Uri'] = signData.uri
    headers['X-Access-Principal'] = signData.pricipal
    headers['X-Access-Timestamp'] = signData.timestamp
    headers['X-Access-Token'] = signData.accessToken
    // 对于get请求，处理查询参数。所有参数值按照字典排序，然后拼接成字符串放入变量paramValues中
    var paramValues = ''
    var jsonRequestBody = ''
    if (config.params && Object.keys(config.params).length > 0) {
      // 有参数
      paramValues = _getParameterValues(config.params)
    }
    // POST请求,以x-www-form-urlencoded 提交数据
    if (typeof data === 'string') {
      // 表示以x-www-form-urlencoded 提交数据
      var param = qs.parse(data,{ ignoreQueryPrefix: true,allowDots: true })
      if (param && typeof (param) === 'object') {
        paramValues = Object.values(param).sort().join('')
      }else {
        paramValues = _getParameterValues(data)
      }
    }
    // POST 请求，以 json 格式提交数据
    if (data && typeof data === 'object' && Object.keys(data).length > 0) {
      jsonRequestBody = JSON.stringify(data)
    }
    console.log('paramValues**********>',paramValues)
    const signContent = `${signData.pricipal}|${signData.timestamp}|${signData.uri}|${paramValues}|${jsonRequestBody}`
    console.log('signContent =======', signContent)
    const securityKey = signData.securityKey
    headers['X-Access-Sign'] = HmacSHA256(signContent, securityKey) + ''
    // console.log('X-Access-Sign**********>',headers['X-Access-Sign'])
    config.headers=headers
  }



// 请求方式的配置
export default {
    get(url, params,needSign) {  // get
      //params 可以传对象 数组 ?a=1&a=2&user.name=123=>{a:[1,2],user:{name:123}}
        let p={}
        const index=url.indexOf('?')
        if(index!=-1){
          //问号替换成空格
            let urlParam=url.replace(/^.+\?/,'')
            urlParam=qs.parse(urlParam,{ ignoreQueryPrefix: true,allowDots: true })
            if(urlParam){
                Object.assign(p,urlParam)
            }
            url=url.substring(0,index)
        }
        if(params){
            Object.assign(p,params)
        }
        let config={params:p} // 配置信息
        config.paramsSerializer = function(params) {
            return qs.stringify(params, { arrayFormat: 'brackets', allowDots: true })
        }
        if(needSign===false){

        }else{
            //需要进行签名
            _signHeader(url,null,config)
        }

        return axios.get(url,config).then(
            (response) => {
                return checkStatus(response)
            }
        ).then(
            (res) => {
                return checkCode(res)
            }
        )
    },
    post(url, data,headers,needSign) {  //  post
        if (headers!=="json"){
            data=_toParams(data);
        }
        let config = {}
        if(needSign===false){

        }else{
            //需要进行签名
            _signHeader(url,data,config)
        }
        return axios.post(url,data,config).then(
            (response) => {
                return checkStatus(response)
            }
        ).then(
            (res) => {
              console.log(res);
              console.log("-=======--问问")
                return checkCode(res)
            }
        )
    },
    put(url, data,headers,needSign) {  //  post
        if (headers!=="json"){
            data=_toParams(data);
        }
        let config = {}
        if(needSign===false){

        }else{
            //需要进行签名
            _signHeader(url,data,config)
        }
        return axios.put(url,data,config).then(
            (response) => {
                return checkStatus(response)
            }
        ).then(
            (res) => {
                return checkCode(res)
            }
        )
    },

    delete(url, needSign) {
        let config = {}
        if(needSign===false){

        }else{
            //需要进行签名
            _signHeader(url,null,config)
        }
        return axios.delete(url,config).then(
            (response) => {
                return checkStatus(response)
            }
        ).then(
            (res) => {
              console.log(res);
                return checkCode(res)
            }
        )
    }
}
